home *** CD-ROM | disk | FTP | other *** search
- /* GREP.c: A generalized regular expression parser.
- */
-
- #include "stdio.h"
- #include "tools.h"
-
- #define MAXLINE 255
- #define MAX_EXPR 64
-
- int vflag, yflag, cflag, lflag, nflag, hflag, fflag;
-
- main(argc,argv)
- int argc;
- char **argv;
- {
- int i, j, linenum, count;
-
- int line[MAXLINE];
- int numfiles;
- FILE *stream;
- int exprc;
-
- TOKEN *exprv[MAX_EXPR];
-
- i = 1;
-
- if (argc <2)
- abort( pr_usage(1) );
-
- if ( *argv[i] == '-')
- {
-
- expand_sw( argv[i++] );
-
- if ( i == argc )
- abort( pr_usage(1) );
- }
-
- if ( (exprc = get_expr( exprv, MAX_EXPR, &argv[i++])) == 0 )
- abort ( pr_usage(2) );
-
- numfiles = argc - i;
-
- do
- {
- if ( numfiles)
- {
- stream = fopen( argv[i], "r");
-
- if (stream == NULL)
- {
- fprintf(stderr, "Can't open %s\n", argv[i]);
- continue;
- }
- }
- else
- {
- stream = stdin;
- }
-
- count = 0;
- linenum = 1;
-
- while ( fgets(line, MAXLINE, stream) )
- {
- if (yflag )
- stoupper(line);
-
- for ( j = exprc ; --j >= 0 ; )
- {
- if ( matchs(line , exprv[j]) )
- {
- count++;
- pr_match(linenum, line, argv[i], 1, numfiles);
- }
- else
- {
- pr_match(linenum, line, argv[i], 0, numfiles);
- }
-
- linenum++;
- cntrl_c();
- }
- if( lflag && count )
- break;
- }
- pr_count( numfiles, argv[i], count );
- fclose (stream);
-
- } while (++i < argc);
-
- abort();
- }
-
-
- pr_count( fcount, fname, count)
- int fcount, count;
- char *fname;
- {
-
- if (!cflag)
- return;
-
- if (fcount > 1)
- printf("%-12s: ", fname );
-
- printf( "%d\n", count );
- }
-
-
- pr_match(linenum, line, fname, match, numfiles)
- int linenum, match;
- char *line, *fname;
- {
-
- char buf[80];
-
- if (cflag)
- return;
-
- if ( (vflag && !match) || (!vflag && match) )
- {
- if (!hflag && ( (numfiles >1) || lflag) )
- printf("%s%s", fname, lflag ? "\n" : ":" );
-
- if (nflag)
- printf("%03d:", linenum );
-
- if (!lflag)
- printf("%s", line );
- }
- }
-
-
- pr_usage(num)
- int num;
- {
-
- #ifdef DEBUG
- fprintf(stderr, "%d ", num);
- #endif
- fprintf(stderr,"usage: grep [-cefhlnvy] [expression] <files ...>\n");
- }
-
-
- abort()
- {
- exit();
- }
-
-
- expand_sw( str )
- char *str;
- {
-
-
- vflag = 0;
- cflag = 0;
- lflag = 0;
- nflag = 0;
- hflag = 0;
- fflag = 0;
- yflag = 0;
-
- while (*str)
- {
- switch ( toupper(*str))
- {
- case '-':
- case 'E':
- break;
-
- case 'C':
- cflag = 1;
- break;
-
- case 'F':
- fflag = 1;
- break;
-
- case 'H':
- hflag = 1;
- break;
-
- case 'L':
- lflag = 1;
- break;
-
- case 'N':
- nflag = 1;
- break;
-
- case 'V':
- vflag = 1;
- break;
-
- case 'Y':
- yflag = 1;
- break;
-
- default:
- pr_usage(3);
- abort();
- break;
- }
-
- str++;
- }
- }
-
-
- int do_or( lp, expr, maxi )
- char *lp;
- TOKEN **expr;
- int maxi;
- {
-
- int found;
- TOKEN *pat;
- char *op;
-
- found = 0;
-
- if( yflag )
- stoupper( lp );
-
- while (op = in_string(OR_SYM, lp) )
- {
- if(found <= maxi && (pat = makepat(lp, OR_SYM)) )
- {
- *expr++ = pat;
- found++;
- }
- lp = ++op;
-
- if ( pat == 0 )
- goto fatal_err;
- }
-
- if (found <= maxi && (pat = makepat( lp, OR_SYM)) )
- {
- found++;
- *expr = pat;
- }
-
- if ( pat == 0)
- {
-
- fatal_err:
- printf("Illegal expression\n");
- exit();
- }
-
- return (found);
- }
-
-
- get_expr( expr, maxi, defexpr)
- TOKEN *expr[];
- int maxi;
- char **defexpr;
- {
- FILE *stream;
- int count;
-
- char line[MAXLINE];
-
- #ifdef DEBUF
- int i;
- #endif
-
- count = 0;
-
- if ( fflag )
- {
- if ( (stream = fopen(*defexpr, "r")) == NULL )
- {
- fprintf(stderr, "Can't open %s\n", *defexpr);
- abort();
- }
-
- while ( (maxi - count) && fgets(line, MAXLINE, stream) )
- {
- count += do_or(line, &expr[count], maxi - count );
- }
-
- fclose (stream);
- }
- else
- {
- if ( count += do_or( *defexpr, &expr[count], maxi - count))
- *defexpr = " ";
- }
-
- #ifdef DEBUG
- for (i = count; --i >= 0; )
- {
- pr_tok(expr[i]);
- printf("--------------------------------------\n");
- }
- #endif
- return(count);
- }
-
-
- cntrl_c()
- {
- }
-
-